--[[
/*******************************************************************************

  Este programa está basado en el programa Sokoban desarrollado por el LIFIA - 
  Facultad de Informatica - Univ. Nacional de La Plata

  Copyright 2011 PLADEMA - Facultad de Ciencias Exactas - UNICEN
  Copyright 2010 LIFIA - Facultad de Informatica - Univ. Nacional de La Plata

********************************************************************************

    This program is free software: you can redistribute it and/or modify it
  under the terms of the GNU General Public License as published by the Free
  Software Foundation, either version 2 of the License.

    Ginga is distributed in the hope that it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along with
  this program. If not, see <http://www.gnu.org/licenses/>.

********************************************************************************

    Este programa es Software Libre: Ud. puede redistribuirlo y/o modificarlo
  bajo los términos de la Licencia Pública General GNU como es publicada por la
  Free Software Foundation, según la versión 2 de la licencia.

    Ginga se distribuye esperando que resulte de utilidad, pero SIN NINGUNA
  GARANTÍA; ni siquiera la garantía implícita de COMERCIALIZACIÓN o ADECUACIÓN
  PARA ALGÚN PROPÓSITO PARTICULAR. Para más detalles, revise la Licencia Pública
  General GNU.

    Ud. debería haber recibido una copia de la Licencia Pública General GNU
  junto a este programa. Si no, puede verla en <http://www.gnu.org/licenses/>.

*******************************************************************************/
]]--


-- Importo el juego de Tateti
local TatetiLibrary = require 'TatetiGame'

tatetiGame = TatetiLibrary.TatetiGame:new()

local imgBackground = canvas:new('images/fondo.jpg')
local imgCross = canvas:new('images/cruz.png')
local imgCircle = canvas:new('images/circulo.png')
local imgLine = canvas:new('images/linea.png')  
local imgCircleWinner = canvas:new('images/gano_circulo.png')
local imgCrossWinner = canvas:new('images/gano_cruz.png')

local winner = 0

tatetiVisualBoard = {}

function initGraphicalParameters()
	-- Crea una matriz del tamaño del tablero en la que indica en que coordenadas gráficas deben ir ubicadas
	-- las piezas en cada una de las casillas del tablero
	for i = 0, 2 do
		tatetiVisualBoard[i]={}
		for j = 0, 2 do
			tatetiVisualBoard[i][j] = 0
		end
	end
	-- Fila 0
	tatetiVisualBoard[0][0] = {x = 144, y = 57}
	tatetiVisualBoard[0][1] = {x = 344, y = 53}
	tatetiVisualBoard[0][2] = {x = 570, y = 51}
	-- Fila 1
	tatetiVisualBoard[1][0] = {x = 137, y = 237}
	tatetiVisualBoard[1][1] = {x = 363, y = 224}
	tatetiVisualBoard[1][2] = {x = 593, y = 221}
	-- Fila 2
	tatetiVisualBoard[2][0] = {x = 127, y = 409}
	tatetiVisualBoard[2][1] = {x = 370, y = 406}
	tatetiVisualBoard[2][2] = {x = 612, y = 403}
end

function drawPlayer()
	actualI, actualJ = tatetiGame:getActualPos();
	canvas:compose(tatetiVisualBoard[actualI][actualJ].x, tatetiVisualBoard[actualI][actualJ].y, imgLine)
end

function drawActualBoard()
	for i = 0, 2 do
		for j = 0, 2 do
			if tatetiGame:getBoardValue(i, j) == tatetiGame.CROSS then
				canvas:compose(tatetiVisualBoard[i][j].x, tatetiVisualBoard[i][j].y, imgCross)
			elseif tatetiGame:getBoardValue(i, j) == tatetiGame.CIRCLE then
				canvas:compose(tatetiVisualBoard[i][j].x, tatetiVisualBoard[i][j].y, imgCircle)
			end
		end
	end
end

function drawWinner()
	if winner == tatetiGame.CROSS then
		canvas:compose(0,0, imgCrossWinner)
	elseif winner == tatetiGame.CIRCLE then
		canvas:compose(0,0, imgCircleWinner)
	end
end

function updateScreen()
	canvas:compose(0, 0, imgBackground)
	drawPlayer()
	drawActualBoard()
	if winner ~= 0 then
		drawWinner()
	end
end

function resetGame()
	winner = 0
	tatetiGame:reset()
end

-- Handler de eventos
function onKeyPress(evt)
	if evt.class == 'key' and evt.type == 'press' then
		if winner == 0 then 
			if evt.key=='CURSOR_LEFT' then
				tatetiGame:move(0, -1)
				print("Izquierda")
			elseif evt.key=='CURSOR_RIGHT' then
				tatetiGame:move(0, 1)
				print("Derecha")
			elseif evt.key=='CURSOR_UP' then
				tatetiGame:move(-1, 0)
				print("Arriba")
			elseif evt.key=='CURSOR_DOWN' then
				tatetiGame:move(1, 0)
				print("Abajo")
			elseif (evt.key=='ENTER' or evt.key =='OK') then
				print("apretaste Enter")
				if not tatetiGame:occuped (tatetiGame:getActualPos()) then
					tatetiGame:playActualPlayer()
					if tatetiGame:isTie() then
						winner = 3;
					end
					if tatetiGame:isWinner( tatetiGame:getActualPlayer() ) then
						winner = tatetiGame:getActualPlayer()
					else
						tatetiGame:changePlayer()
					end
				end
			end
		else
			resetGame()
		end	
		
		updateScreen()
			
		canvas:flush()
	end
	return true 
end

initGraphicalParameters()
event.register(onKeyPress)

